/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo.DAL;

/**
 *
 * @author Jose Leonardo
 */
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.text.SimpleDateFormat;
import Modelo.Asistencia;
import java.sql.PreparedStatement;
import java.sql.Time;

import org.json.*;
//import java.io.PrintWriter;

public class Asistencia_DAO {

    public boolean insertarAsistencia(Asistencia a) {
        ConexionBD conexion = new ConexionBD();
        PreparedStatement s = null;
        if (conexion.session == null) {
            return false;
        }
        try {
            String query = "insert into asistencia (ci, id_guardia, hora_llegada, "
                    + "hora_salida, nombre_espacio, nombre_sede, condicion, status, observaciones) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";

            Time llegada = (a.getHoraLlegada() != null && a.getHoraLlegada().length() > 0)
                    ? Time.valueOf(a.getHoraLlegada()) : null;
            Time salida = (a.getHoraSalida() != null && a.getHoraSalida().length() > 0)
                    ? Time.valueOf(a.getHoraSalida()) : null;

            s = conexion.session.prepareStatement(query);
            s.setString(1, a.getCi());
            s.setInt(2, a.getIdGuardia());
            s.setTime(3, llegada);
            s.setTime(4, salida);
            s.setString(5, a.getNombreEspacio());
            s.setString(6, a.getNombreSede());
            s.setString(7, a.getCondicion());
            s.setString(8, a.getStatus());
            s.setString(9, a.getObservaciones());

            System.out.println(query);
            s.executeUpdate();
            return true;
        } catch (SQLException se) {
            System.out.println("Error al insertar una asistencia.\n" + se.getMessage());
            return false;
        } finally {
            if (conexion.session != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static JSONObject consultarAsistencia(Asistencia a, String desde, String hasta, String limit, String offset, String order, String asc) {
        ConexionBD conex = new ConexionBD();
        JSONObject asistencias = new JSONObject();

        try {
            String query = "SELECT cu.ci, cu.nombre_1, cu.apellido_1, "
                    + "a.hora_llegada, a.hora_salida, a.nombre_sede, a.condicion, "
                    + "a.status, a.observaciones, a.id_guardia, "
                    + "to_char(g.fecha_guardia,'DD-MM-YYYY')m, g.id_grupo ";
            String from = "FROM ((asistencia a left outer join guardia g on (a.id_guardia=g.id_guardia)) join "
                    + "(personal_dsi pdsi natural join comunidad_universitaria cu) on (a.ci=pdsi.ci)) ";
            String params = "WHERE (1=1) ";
            if (a.getCi() != null && !a.getCi().equals("")) {
                params += "and cu.ci = '" + a.getCi() + "' ";
            }
            if (desde != null && !desde.equals("")) {
                params += "and g.fecha_guardia >= date '" + desde + "' ";
            }
            if (hasta != null && !hasta.equals("")) {
                params += "and g.fecha_guardia <= date '" + hasta + "' ";
            }
            if (a.getNombreSede() != null && !a.getNombreSede().equals("")) {
                params += "and a.nombre_sede = '" + a.getNombreSede() + "' ";
            }
            if (a.getCondicion() != null && !a.getCondicion().equals("")) {
                params += "and a.condicion = '" + a.getCondicion() + "' ";
            }

            String format = " ";
            if (order != null && !order.equals("")) {
                format += " order by " + order;
                if (asc != null && !asc.equals("") && asc.equals("false")) {
                    format += " desc";
                } else {
                    format += " asc";
                }
            }

            if (limit != null && !limit.equals("")) {
                format += " limit " + limit;
            }
            if (offset != null && !offset.equals("")) {
                format += " offset " + offset;
            }

            System.out.println(query + from + params + format);
            Statement st = (Statement) conex.session.createStatement();
            ResultSet rs = st.executeQuery(query + from + params + format);
            int i = 0;
            JSONArray ja = new JSONArray();
            while (rs.next()) {
                JSONObject r = new JSONObject();
                r.put("cedula", rs.getString(1));
                r.put("nombre", rs.getString(2));
                r.put("apellido", rs.getString(3));
                r.put("llegada", rs.getString(4));
                r.put("salida", rs.getString(5));
                r.put("sede", rs.getString(6));
                r.put("condicion", rs.getString(7));
                r.put("status", rs.getString(8));
                r.put("observaciones", rs.getString(9));
                r.put("idGuardia", rs.getString(10));
                r.put("fecha", rs.getString(11));
                r.put("grupo", rs.getString(12));
                ja.put(i++, r);
            }

            asistencias.put("Asistencias", ja);

            query = "select count(*) " + from + params;
            System.out.println(query);
            rs = st.executeQuery(query);
            if (rs.next()) {
                asistencias.put("tam", rs.getString(1));
            }
        } catch (Exception e) {
            System.out.println("Error consultando roles: " + e.getMessage());
        } finally {
            if (conex != null) {
                conex.cerrarConexion();
            }
        }
        return asistencias;
    }

    public LinkedList<Modelo.ComunidadUniversitaria> listaPersonalAsistencia(String sede, String fechaG) {
        ConexionBD conex = new ConexionBD();
        //JSONObject nombreEspacios = new JSONObject();
        LinkedList lista = new LinkedList();
        try {
            Statement st = conex.session.createStatement();
            String sql = "select cu.ci, cu.nombre_1, cu.apellido_1 "
                    + "from comunidad_universitaria cu, asistencia a "
                    + "where cu.ci = a.ci and a.ausente = true and a.id_guardia in "
                    + "(select g.id_guardia from guardia g where "
                    + "g.sede = '" + sede + "' and g.fecha_guardia = '" + fechaG + "')";
            ResultSet rs = st.executeQuery(sql);
            //int i = 0;
            while (rs.next()) {

                Modelo.ComunidadUniversitaria persAsist = new Modelo.ComunidadUniversitaria();

                persAsist.setCi(rs.getString(1));
                persAsist.setNombre1(rs.getString(2));
                persAsist.setApellido1(rs.getString(3));
                lista.add(persAsist);
                //nombreEspacios.put(""+i++,persAsist);
            }
        } catch (Exception e) {
            System.out.println("Error al consultar los empleados de una "
                    + "guardia\n" + e.getMessage());
        }
        //return nombreEspacios;
        return lista;
    }

    public JSONObject consultarIdArea(String sede) {
        ConexionBD conex = new ConexionBD();
        JSONObject idAreas = new JSONObject();
        try {
            Statement st = conex.session.createStatement();
            String sql = "select id_area,descripcion from area "
                    + "where nombre_sede = '" + sede + "' order by id_area";
            ResultSet rs = st.executeQuery(sql);
            int i = 0;
            while (rs.next()) {
                JSONObject nEspacio = new JSONObject();
                nEspacio.put("idarea", rs.getString("id_area"));
                nEspacio.put("descrip", rs.getString("descripcion"));
                idAreas.put("" + i++, nEspacio);
            }
        } catch (Exception e) {
        }
        return idAreas;
    }

    public JSONObject listaPersonalAsistenciaArea(String sede, String fechaG, String idArea) {
        ConexionBD conex = new ConexionBD();
        JSONObject listAsist = new JSONObject();
        try {
            Statement st = conex.session.createStatement();
            String sql = "select cu.ci, cu.nombre_1, cu.apellido_1 "
                    + "from ((comunidad_universitaria cu join asistencia a "
                    + "on (cu.ci = a.ci)) join guardia g on (a.id_guardia=g.id_guardia)) "
                    + "join espacio e on (a.nombre_espacio=e.nombre_espacio) "
                    + "where a.condicion='Presente' and a.nombre_sede='" + sede + "' "
                    + "and g.fecha_guardia = '" + fechaG + "' and e.id_area = '" + idArea + "'";
            System.out.println(sql);
            ResultSet rs = st.executeQuery(sql);
            int i = 0;
            while (rs.next()) {
                JSONObject asist = new JSONObject();
                asist.put("ci", rs.getString("ci"));
                asist.put("nombre", rs.getString("nombre_1"));
                asist.put("apellido", rs.getString("apellido_1"));
                listAsist.put("" + i++, asist);
            }
            System.out.println("\n\nNumero de empleados: " + i);
        } catch (Exception e) {
            System.out.println("Error al consultar los empleados de una "
                    + "guardia\n" + e.getMessage());
        }
        return listAsist;
    }

    public JSONObject consultarNombreEspacios(String sede) {
        ConexionBD conex = new ConexionBD();
        JSONObject nombreEspacios = new JSONObject();
        try {
            Statement st = conex.session.createStatement();
            String sql = "select nombre_espacio from espacio "
                    + "where nombre_sede = '" + sede + "' order by nombre_espacio";
            ResultSet rs = st.executeQuery(sql);
            int i = 0;
            while (rs.next()) {
                JSONObject nEspacio = new JSONObject();
                nEspacio.put("nombre", rs.getString(1));
                nombreEspacios.put("" + i++, nEspacio);
            }
        } catch (Exception e) {
        }
        return nombreEspacios;
    }

    //Deberia ir en Espacio_DAO
    public LinkedList getNombreEspacios() {

        ConexionBD conexion = new ConexionBD();
        if (conexion.session == null) {
            return null;
        }
        Statement stt = null;
        LinkedList list = new LinkedList();
        try {
            stt = conexion.session.createStatement();
            String query = "select nombre_espacio from espacio";
            ResultSet rs = stt.executeQuery(query);
            while (rs.next()) {
                String nombreEspacio = rs.getString(1);
                list.add(nombreEspacio);
            }
        } catch (SQLException se) {
            System.out.println("Error al listar los nombres de los espacios.\n"
                    + se.getMessage());
        } finally {
            if (conexion.session != null) {
                conexion.cerrarConexion();
            }
        }

        return list;
    }

    public JSONObject listarCIPersonalDSI(String fecha, String sede) {

        ConexionBD conexion = new ConexionBD();
        if (conexion.session == null) {
            return null;
        }
        Statement stt = null;
        //LinkedList list = new LinkedList();
        JSONObject listAsist = new JSONObject();
        try {
            stt = conexion.session.createStatement();

            /*String query = "select ci from asistencia A where a.presente='true' and A.id_guardia in "
            + "(select G.id_guardia from guardia G "
            + "where fecha_guardia = '"+fecha+"')";*/

            String query = "select A.ci, C.nombre_1, C.apellido_1 "
                    + "from asistencia A, comunidad_universitaria C "
                    + "where A.presente='true' and A.ci = C.ci "
                    + "and A.id_guardia in "
                    + "(select G.id_guardia from guardia G "
                    + "where fecha_guardia = '" + fecha + "' and sede = '" + sede + "')";

            ResultSet rs = stt.executeQuery(query);
            int i = 0;
            SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
            SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm:ss");
            while (rs.next()) {
                //Asistencia ast = new Asistencia();
                JSONObject ciPers = new JSONObject();

                //String horaLlegS = rs.getString("hora_llegada");
                //java.util.Date horaLlegD = java.sql.Date.valueOf(horaLlegS);

                String ci = rs.getString("ci");
                ciPers.put("ci", rs.getString("ci"));
                ciPers.put("nombre", rs.getString("nombre_1"));
                ciPers.put("apellido", rs.getString("apellido_1"));
                System.out.println("CI: " + ci);

                listAsist.put("" + i++, ciPers);
            }
        } catch (SQLException se) {
            System.out.println("Error al listar las cedulas de los empleados.\n"
                    + se.getMessage());
        } catch (Exception e) {
            System.out.println("Error al listar las cedulas de los empleados.\n"
                    + e.getMessage());
        } finally {
            if (conexion.session != null) {
                conexion.cerrarConexion();
            }
        }

        //return list;
        return listAsist;
    }

    public JSONObject buscarAsistencia(String ci, String fecha) {

        ConexionBD conexion = new ConexionBD();
        if (conexion.session == null) {
            return null;
        }
        Statement stt = null;
        //LinkedList list = new LinkedList();
        JSONObject listAsist = new JSONObject();
        try {
            stt = conexion.session.createStatement();
            String query = "select a.nombre_espacio, a.hora_llegada, "
                    + "a.hora_salida, a.presente, a.observaciones, g.sede "
                    + "from asistencia a, guardia g"
                    + " where a.id_guardia = g.id_guardia and a.ci ='" + ci + "' "
                    + "and g.fecha_guardia = '" + fecha + "'";

            /*String query = "select A.hora_llegada, A.hora_salida, A.nombre_espacio "
            + "from asistencia A where A.ci='"+ci+"' and A.id_guardia in "
            + "(select G.id_guardia from guardia G "
            + "where fecha_guardia = '"+fecha+"')";*/


            ResultSet rs = stt.executeQuery(query);
            int i = 0;
            SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
            SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm:ss");
            while (rs.next()) {
                //Asistencia ast = new Asistencia();

                JSONObject asist = new JSONObject();


                System.out.println("\n\n\n\nHora de llegada: " + rs.getString("hora_llegada") + " " + rs.getString("hora_salida"));
                java.util.Date horaLleg = sdf2.parse(rs.getString("hora_llegada"));
                String hora_lleg = sdf.format(horaLleg);
                java.util.Date horaSal = sdf2.parse(rs.getString("hora_salida"));
                String hora_sal = sdf.format(horaSal);
                //asist.put("id_guardia", rs.getLong("id_guardia"));
                asist.put("hora_llegada", hora_lleg);
                asist.put("hora_salida", hora_sal);
                asist.put("nombre_espacio", rs.getString("nombre_espacio"));
                asist.put("sede", rs.getString("sede"));
                asist.put("observ", rs.getString("observaciones"));
                asist.put("presente", rs.getString("presente"));

                //list.add(ast);

                listAsist.put("" + i++, asist);

                //String horaLlegS = rs.getString("hora_llegada");
                //java.util.Date horaLlegD = java.sql.Date.valueOf(horaLlegS);

                //System.out.println("Hora arreglada "+shll);


            }
        } catch (SQLException se) {
            System.out.println("Error al listar las cedulas de los empleados.\n"
                    + se.getMessage());
        } catch (Exception e) {
            System.out.println("Error al listar las cedulas de los empleados.\n"
                    + e.getMessage());
        } finally {
            if (conexion.session != null) {
                conexion.cerrarConexion();
            }
        }

        //return list;
        return listAsist;
    }

    public Long obtenerIdGuardia(String fechaG, String ci) {
        ConexionBD conexion = new ConexionBD();
        Long idGuardia = null;
        if (conexion.session == null) {
            return null;
        }
        Statement stt = null;

        try {
            stt = conexion.session.createStatement();
            String query = "select a.id_guardia from asistencia a, guardia g "
                    + "where a.id_guardia = g.id_guardia and a.ci ='" + ci + "' "
                    + "and g.fecha_guardia = '" + fechaG + "'";

            ResultSet rs = stt.executeQuery(query);
            int i = 0;
            SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
            SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm:ss");
            while (rs.next()) {
                idGuardia = rs.getLong("id_guardia");

            }
            System.out.println("\n\nId Guardia: " + idGuardia);
        } catch (SQLException se) {
            System.out.println("Error al obtener el id de la guardia.\n"
                    + se.getMessage());
        } catch (Exception e) {
            System.out.println("Error al obtener el id de la guardia.\n"
                    + e.getMessage());
        } finally {
            if (conexion.session != null) {
                conexion.cerrarConexion();
            }
        }
        return idGuardia;
    }

    public boolean modifAsistencia(Asistencia asist) {
        boolean b = false;


        ConexionBD conexion = new ConexionBD();
        if (conexion.session == null) {
            return false;
        }
        Statement stt = null;

        try {
            stt = conexion.session.createStatement();
            int idGuardia = asist.getIdGuardia();
            String ci = asist.getCi();

            String observ = asist.getObservaciones();
            boolean presente = asist.getCondicion() != null && asist.getCondicion().equals("presente");

            String aux = "";

            if (presente) {
                SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
                String espacio = asist.getNombreEspacio();
                String horaLleg = sdf.format(asist.getHoraLlegada());
                String horaSal = sdf.format(asist.getHoraSalida());
                aux += ", nombre_espacio = '" + espacio
                        + "' , hora_llegada = '" + horaLleg
                        + "' , hora_salida = '" + horaSal
                        + "' , presente = 'true'"
                        + ", ausente  = 'false'";
            } else {
                aux += ", presente = 'false', ausente = 'true'";
            }

            /*String query = "update asistencia set nombre_espacio = '"+espacio+"', "
            + "hora_llegada = '"+horaLleg+"', hora_salida = '"
            + horaSal + "', observaciones = '"+observ+"'"
            + " where id_guardia = "+idGuardia.toString()
            + " and ci = '"+ci+"'";*/
            String query = "update asistencia set "
                    + "observaciones = '" + observ + "'" + aux
                    + " where id_guardia = " + idGuardia
                    + " and ci = '" + ci + "'";
            System.out.println(query);
            stt.execute(query);

            b = true;

        } catch (Exception e) {
            System.out.println("Error al modificar la asistencia \n"
                    + e.getMessage());

        } finally {
            if (conexion.session != null) {
                conexion.cerrarConexion();
            }
        }
        return b;
    }
}
